package day03.ClassAndObject
/**
 * 注意:
 * 语法糖：obj(arg) 实际上是 obj.apply(arg) 的语法糖
 *
 * ================================================
 *
 特性	   伴生类 (Class)	           伴生对象 (Object)
 实例化	 可以创建多个实例	           单例，只有一个实例
 成员访问	 可以访问伴生对象的私有成员	   可以访问伴生类的私有成员
 用途	   表示有状态的对象	           包含静态方法、工厂方法、常量等
 构造函数	 可以有参数	                 无参（单例）
 内存分配	  每个实例分配独立内存	       全局共享一个实例
 * ================================================
 */
object CompanionExample  extends  App {

  // 使用伴生对象的工厂方法创建实例
  val person1 = Person("Alice", 30)
  // 使用 重载的 工厂方法
  val person2 = Person("Bob")

  // 调用实例方法
  person1.greet()  // Hello, my name is Alice

  // 访问实例属性
  println(person1.name) // Alice

  // 访问伴生对象的常量
  println(Person.Species)  // Homo sapiens

  // 调用伴生对象的静态方法
  println(Person.staticMethod())  // This is a static method from the companion object

  // 调用使用伴生对象私有成员的方法
  println(person1.description)   // Alice is 30 years old. This is a secret!

  // 通过伴生对象访问伴生类的私有方法
  println(Person.showDetails(person1))  // Name: Alice, Age: 30


  // 尝试直接访问私有成员会导致编译错误
  // println(person1.age) // 编译错误: age is private
  // println(Person.secretMessage) // 编译错误: secretMessage is private
}
